package com.zhuiyun.project.api.filemanage.service.impl;

import com.zhuiyun.project.config.VariableConfig;
import com.zhuiyun.project.api.filemanage.entity.FileManage;
import com.zhuiyun.project.api.filemanage.mapper.FileManageMapper;
import com.zhuiyun.project.api.filemanage.service.FileManageService;
import com.zhuiyun.project.common.errorCode.CommonException;
import com.zhuiyun.project.util.DateTimeUtils;
import com.zhuiyun.project.util.ObjectUtils;
import com.zhuiyun.project.util.StringUtils;
import com.zhuiyun.project.util.UploadFileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Date;
import java.util.UUID;

/**
 * @ClassName FileManageServiceImpl
 * @Description TODO
 * @Author kdj
 * @Date 2023/6/23 9:05
 **/
@Service
public class FileManageServiceImpl implements FileManageService {

    @Autowired
    private FileManageMapper fileManageMapper;

    @Autowired
    private VariableConfig variableConfig;



    /**
     * @param fileManage
     * @Author kdj
     * @Description 上传图片
     * @Date 2023/6/23 9:07
     * @Return boolean
     */
    @Override
    public boolean addFile(FileManage fileManage) {
        //判断fileManage是否为空
        if (ObjectUtils.isNotEmpty(fileManage)) {
            fileManage.setDelFlag(0);
            int insert = fileManageMapper.insertSelective(fileManage);
            if (insert > 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * @Author kdj
     * @Description 用户图片上传
     * @Date 2023/6/27 9:23
     * @Return java.lang.Integer
     * @param multipartRequest
     */
    @Override
    public Integer uploadFile(MultipartRequest multipartRequest) {
        //获取 文件
        MultipartFile file = multipartRequest.getFile("file");
        //s上传
        String s = UploadFileUtils.uploadAvatar(file);
        return Integer.parseInt(s);
    }


    /**
     * 根据id 获取本地视频
     * @param response
     * @param id
     */
    @Override
    public void getVideoById(HttpServletResponse response, Integer id) throws CommonException, FileNotFoundException {
        if(StringUtils.isNotEmpty(id)){
            // 获取我呢见对象
            FileManage fileManage = fileManageMapper.selectByPrimaryKey(id);
            if(fileManage!=null&&variableConfig.getVideoType().contains(fileManage.getFileType())){
                // 拼接图片路径
                File file = new File(variableConfig.getRootPath() + File.separator + fileManage.getFilePath() + File.separator + fileManage.getFileUuidName());
                if(file.exists()){
                    RandomAccessFile targetFile = new RandomAccessFile(file, "r");
                    OutputStream os = null;
                    try {
                        //设置响应头，把文件名字设置好
                        response.setContentType("application/octet-stream;charset=UTF-8");
                        String fileName = new String(fileManage.getFileName().getBytes(), "iso8859-1");
                        response.setHeader("Content-disposition", "inline;filename=" + fileName);
                        //设置文件长度
                        response.setHeader("Content-Length", String.valueOf(fileManage.getFileSize()));
                        //解决编码问题

                        byte[] cache = new byte[(int) file.length()];
                        // 获取输出流
                        os = response.getOutputStream();
                        int flag;
                        while ((flag = targetFile.read(cache))!=-1){
                            os.write(cache, 0, flag);
                        }
                        os.flush();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        // 关闭流
                        closeIO(os,null);
                    }
                }else{

                }
            }else{

            }
        }else {

        }

    }


    /**
     * 视频上传
     * @author 温
     * @date 2023/7/13 20:38
     * @parameter [file, projectName]
     * @return com.zhuiyun.project.api.filemanage.entity.FileManage
     */
    @Override
    @Transactional
    public FileManage saveFileToSystem(MultipartFile file, String projectName) throws CommonException {
        FileManage fileManage = null;
        // 判断file对象是否为空
        if (StringUtils.isNotEmpty(file)) {
            //文件路径
            String fileAllPath = "";
            //获取文件名称
            String filename = file.getOriginalFilename();
            // 获取文件后缀名称
            int begin = filename.indexOf(".");
            int last = filename.length();
            String fileType = filename.substring(begin, last);
            //文件大小
            long fileSize = file.getSize();
            // 拼接时间文件夹
            String format = DateTimeUtils.format("yyyyMMdd",new Date());
            // 加密文件名称
            String fileUuidName = "";
            // 文件路径
            String filePath = "";
            //判断文件类型并校验大小是否超出范围
            if (variableConfig.getImageType().contains(fileType)) {
                if (fileSize > variableConfig.getImageSize()*1024*1024) {
                    // 抛出文件大小超出范围异常
                }
                // 项目名称 + path + 时间格式
                filePath = projectName + File.separator + variableConfig.getImagePath()+ File.separator + format;
                // 判断是否是文件 如txt excel
            }  else if (variableConfig.getFileType().contains(fileType)) {
                if (fileSize > variableConfig.getFileSize()*1024*1024) {
                    // 抛出文件大小超出范围异常
                }
                // 项目名称 + path + 时间格式
                filePath = projectName + File.separator + variableConfig.getFilePath()+ File.separator + format;
            } else if (variableConfig.getVideoType().contains(fileType)) {
                if (fileSize > variableConfig.getVideoSize()*1024*1024) {
                    // 抛出文件大小超出范围异常
                }
                // 项目名称 + path + 时间格式
                filePath = projectName + File.separator + variableConfig.getVideoPath()+ File.separator + format;
            } else {
                // 抛出文件类型错误异常

            }
            // 将uuid中‘-’去掉
            fileUuidName = UUID.randomUUID().toString().replace("-","") + fileType;
            // 拼接图片全路径
            fileAllPath = variableConfig.getRootPath()+ File.separator + filePath + File.separator + fileUuidName;
            // 将文件信息封装到对象并保存早数据库
            fileManage = new FileManage();
            fileManage.setFileName(filename);
            fileManage.setFileUuidName(fileUuidName);
            fileManage.setFileType(fileType);
            fileManage.setFileSize(fileSize+ "");
            fileManage.setFilePath(filePath);
            fileManage.setCreateTime(new Date());
            // 保存对象
            fileManageMapper.insert(fileManage);
            // 数据存储成功后将图片存入磁盘
            if(fileManage.getId()>0){
                // 创建 File对象
                File targetFile = new File(fileAllPath);
                //判断文件所在文件夹是否存在
                if (!targetFile.getParentFile().exists()) {
                    //不存在就创建文件夹
                    targetFile.getParentFile().mkdirs();
                }
                try {
                    // 将文件写入系统磁盘
                    file.transferTo(targetFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return fileManage;
    }

    /**
    * @Author kdj
    * @Description 用户图片上传
    * @Date 2023/7/27 9:51
    * @Return java.lang.Integer
    * @param multipartFile
    */
    @Override
    public Integer uploadFile(MultipartFile multipartFile) {
        String s = UploadFileUtils.uploadAvatar(multipartFile);
        return Integer.parseInt(s);
    }


    /**
     * 关闭 输出输入流
     * @param os
     * @param fis
     */
    public void closeIO(OutputStream os,FileInputStream fis){
        // 关闭文件输入流
        if(fis!=null){
            try {
                fis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        // 关闭输出流
        if(os!=null){
            try {
                os.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

}
